package com.leetcode.leetcode1;

import java.util.Stack;

/**
 *  有效的括号
 * @author: luhd
 * @create: 2021-09-01
 */
public class Practice20 {
    public static void main(String[] args) {
        String s = "()[]{}";
        boolean valid = isValid(s);
        System.out.println(valid);
    }
    public static boolean isValid(String s) {
        /*Stack<Character> stack = new Stack<>();
        for(char c: s.toCharArray()){
            // 当c为 (,[,{ 时，入栈他们的另一半   为后面循环到 ),],} 时  与栈顶元素匹配
            if(c=='(') stack.push(')');
            else if(c=='[') stack.push(']');
            else if(c=='{') stack.push('}');
            // 这一步很重要---> 当匹配到 ),],} 这三个的时候 且栈不为空 栈顶弹出的不等于c  则返回  false
            else if(stack.isEmpty()||c!=stack.pop()) return false;
        }
        return stack.isEmpty();*/
        // 普通方法
        Stack<Character> stack = new Stack<>();
        int len = s.length();
        if(len%2==0){
            for (int i = 0; i < len; i++) {
                char c = s.charAt(i);
                if(c=='('||c=='['||c=='{') stack.push(c);
                else if(c==')'){
                    if (!stack.isEmpty()&&stack.peek()=='(') {
                        stack.pop();
                    }else{
                        return false;
                    }
                }
                else if(c==']'){
                    if (!stack.isEmpty()&&stack.peek()=='[') {
                        stack.pop();
                    }else{
                        return false;
                    }
                }
                else if(c=='}'){
                    if (!stack.isEmpty()&&stack.peek()=='{') {
                        stack.pop();
                    }else{
                        return false;
                    }
                }
            }
        }
        return stack.isEmpty();

        // 第三种方法   循环匹配(),[],{}  然后s.split('()').split('[]').split('{}')   return s.isEmpty();
    }
}
